package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流 --- 传输对象 --- 使用高的很 --- 实现序列化接口Serializable
 *             版本号:一定要写,对象写出,对象读入,必须统一版本号
 * ObjectOutputStream   对象输出流   写出--Person.java
 * ObjectInputStream   对象输入流   读入--Person.java
 * 序列化--对象转为二进制
 */

public class ObjectIO {
    //需求:将Person.java文件  变成对象  写出来 --序列化操作
    @Test
    public void testOOS() throws IOException {
        //传输对象  创建对象
        Person p=new Person();
        p.setNames("蔡徐坤");
        p.setSay(new String[]{"迎面走来的你让我蠢蠢欲动,这种感觉我从来没有拥有过~"});
       System.out.println(p.toString());
        //传输符合条件对象---输出流
        //创建低级流 写出  搬运什么都得先用低级流
        //传输符合条件对象---输出流---xxx.obj文件  是一种对象文件保存形式
        FileOutputStream fos=new FileOutputStream("person.obj");
        //高级流传输: ObjectOutputStream
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)---写出对象
         * 作用:将给定对象按照其结构进行转换,转换为一组"组"字节
         * 再通过处理的流写出，写出格式xxx.obj
         *
         * 异常:NotSerializableException
         * 原因:Serializable传输对象上没有实现序列化接口
         * Person类 干掉序列化接口:Serializable
         *
         * 对象文件写出操作需要经过两个步骤:专业术语
         * 1.通过对象输出流将Person类,转换为一组"组"字节,这个过程对象序列化
         * 2.将序列化后的字节在通过字节流(低级流)写出到项目中(硬盘中)做长久的保存  这叫数据持久化
         *
         */
        oos.writeObject(p);


    }

    /**
     * ObjectInputStream 对象输入流/反序列化
     * 反序列化---二进制转换为对象
     *
     * InvalidClassException  反序列化
     *                        版本号不匹配
     *
     * ClassNotFoundException  没有类型的异常
     *                         产生原因:读入对象不正确
     *                         person1.class  保存成person1.obj
     *                         person2.class
     */
    @Test
    public void testOIS(){
        //创建输入流---person.obj--读入
        FileInputStream fis=null;
        ObjectInputStream ois=null;
        BufferedInputStream bw = null;
        try {
            fis=new FileInputStream("person.obj");
            //创建高级流---对象输入流
            ois=new ObjectInputStream(fis);//高中套低
            bw=new BufferedInputStream(ois);
            System.out.println(ois.readObject());//叉出去
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //readObject() 返回读取的对象，反序列化操作



    }
}
